---
id: filepool
title: 文件流池
---

### 定义

命名空间：TouchSocket.Core <br/>
程序集：[TouchSocket.Core.dll](https://www.nuget.org/packages/TouchSocket.Core)


## 一、说明

文件在读，或写的时候，一直都是独占状态。这个问题在不同进程中，似乎是合理的，但是如果在相同进程里，就会显得很呆。例如：我们在下载文件的时候，希望能同一时间多个读取同一个文件。且能有一个闭环的管理。那么，使用FilePool，就显得非常必要了。

## 二、使用读
从FilePool.GetReader的静态函数中，获取一个**线程安全**的文件读取访问器，该访问器具有读，和相关的操作属性。在每次读取后，Position会递增。

使用完成后，可以随时释放。

```csharp showLineNumbers
int len = 0;
byte[] buffer = new byte[1024 * 1024];

using (var reader = FilePool.GetReader(path))
{
    while (true)
    {
        int r = reader.Read(buffer, 0, buffer.Length);
        if (r == 0)
        {
            break;
        }
        len += r;
    }
}

Console.WriteLine(len);
```

## 三、使用写
从FilePool.GetWriter的静态函数中，获取一个文件写入访问器线程安全，该访问器，具有写，和相关的操作属性。在每次写入后，Position会递增。

使用完成后，可以随时释放。

注意默认调用**Dispose**后，文件会根据创建类型是否为**单一访问**而决定是否立即释放。
```csharp showLineNumbers
byte[] buffer = new byte[1024];

using (var writer = FilePool.GetWriter(path,true))
{
    writer.Position = num * package;
    int surLen = package;
    while (surLen > 0)
    {
        int r = Math.Min(surLen, buffer.Length);
        writer.Write(buffer, 0, r);
        surLen -= r;
    }
}
Console.WriteLine("完成");
```

## 四、手动释放文件资源
当某个文件没有及时释放，或者由于不可知异常而没有释放时，可以调用FilePool.TryReleaseFile减少引用，并尝试释放资源。

减少引用的意思是，当某个文件，被创建多个访问器时，会递增其引用数，当引用数不为0时，是不会释放的。所以当调用FilePool.TryReleaseFile时，首先会减少引用，然后才会判断是否可以释放。

当需要强制释放某个文件时，可以采取下列措施。
```csharp showLineNumbers
while (FilePool.TryReleaseFile(fileName, 0).ResultCode!= ResultCode.Success)
{

}
```

